Flutter এ SQLite Database Integration

Mobile App Development - ফ্লাটার (Flutter) - Data Persistence এবং Local Storage
233

Flutter এ SQLite Database Integration করতে হলে sqflite প্যাকেজ ব্যবহার করতে হয়। এটি Flutter অ্যাপে লোকাল ডেটাবেজ ব্যবস্থাপনার জন্য খুবই কার্যকর এবং জনপ্রিয় একটি প্যাকেজ। নিচে SQLite Database Integration করার ধাপগুলো এবং একটি পূর্ণাঙ্গ উদাহরণ দেওয়া হলো।

SQLite Database Integration এর ধাপসমূহ:

ধাপ ১: sqflite এবং path প্যাকেজ যুক্ত করা:

প্রথমে pubspec.yaml ফাইলে sqflite এবং path প্যাকেজ যুক্ত করতে হবে:

dependencies:
  flutter:
    sdk: flutter
  sqflite: ^2.0.0+3
  path: ^1.8.0

sqflite: এটি SQLite ডেটাবেজের জন্য প্যাকেজ।

path: এটি ডিভাইসের লোকাল স্টোরেজে ডেটাবেজের পথ (path) নির্ধারণ করতে সাহায্য করে।

ধাপ ২: মডেল ক্লাস তৈরি করা:

  • ডেটাবেজে ডেটা সংরক্ষণ করতে হলে একটি মডেল ক্লাস তৈরি করা হয় যা ডেটার কাঠামো নির্ধারণ করে।

ধাপ ৩: ডেটাবেজ হেল্পার ক্লাস তৈরি করা:

  • ডেটাবেজ সংরক্ষণ, আপডেট, মুছে ফেলা, এবং ফেচ করার জন্য একটি ডেটাবেজ হেল্পার ক্লাস তৈরি করা হয়।

Flutter এ SQLite Database Integration এর উদাহরণ:

import 'package:flutter/material.dart';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter SQLite Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('SQLite Database Example'),
        ),
        body: UserListScreen(),
      ),
    );
  }
}

// মডেল ক্লাস
class User {
  final int? id;
  final String name;
  final String email;

  User({this.id, required this.name, required this.email});

  // JSON থেকে User অবজেক্টে রূপান্তর
  factory User.fromMap(Map<String, dynamic> json) => User(
        id: json['id'],
        name: json['name'],
        email: json['email'],
      );

  // User অবজেক্ট থেকে JSON এ রূপান্তর
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'email': email,
    };
  }
}

// ডেটাবেজ হেল্পার ক্লাস
class DatabaseHelper {
  static final DatabaseHelper instance = DatabaseHelper._init();
  static Database? _database;

  DatabaseHelper._init();

  Future<Database> get database async {
    if (_database != null) return _database!;
    _database = await _initDB('users.db');
    return _database!;
  }

  Future<Database> _initDB(String filePath) async {
    final dbPath = await getDatabasesPath();
    final path = join(dbPath, filePath);

    return await openDatabase(
      path,
      version: 1,
      onCreate: _createDB,
    );
  }

  Future _createDB(Database db, int version) async {
    const idType = 'INTEGER PRIMARY KEY AUTOINCREMENT';
    const textType = 'TEXT NOT NULL';

    await db.execute('''
CREATE TABLE users (
  id $idType,
  name $textType,
  email $textType
)
''');
  }

  Future<void> insertUser(User user) async {
    final db = await instance.database;
    await db.insert('users', user.toMap());
  }

  Future<List<User>> getUsers() async {
    final db = await instance.database;
    final result = await db.query('users');

    return result.map((json) => User.fromMap(json)).toList();
  }

  Future<void> updateUser(User user) async {
    final db = await instance.database;
    await db.update(
      'users',
      user.toMap(),
      where: 'id = ?',
      whereArgs: [user.id],
    );
  }

  Future<void> deleteUser(int id) async {
    final db = await instance.database;
    await db.delete(
      'users',
      where: 'id = ?',
      whereArgs: [id],
    );
  }

  Future close() async {
    final db = await instance.database;
    db.close();
  }
}

// UI Screen
class UserListScreen extends StatefulWidget {
  @override
  _UserListScreenState createState() => _UserListScreenState();
}

class _UserListScreenState extends State<UserListScreen> {
  late Future<List<User>> _users;

  @override
  void initState() {
    super.initState();
    _users = DatabaseHelper.instance.getUsers();
  }

  @override
  Widget build(BuildContext context) {
    return FutureBuilder<List<User>>(
      future: _users,
      builder: (context, snapshot) {
        if (snapshot.connectionState == ConnectionState.waiting) {
          return Center(child: CircularProgressIndicator());
        } else if (snapshot.hasError) {
          return Center(child: Text('Error: ${snapshot.error}'));
        } else if (snapshot.hasData) {
          final users = snapshot.data!;
          return ListView.builder(
            itemCount: users.length,
            itemBuilder: (context, index) {
              final user = users[index];
              return ListTile(
                title: Text(user.name),
                subtitle: Text(user.email),
              );
            },
          );
        } else {
          return Center(child: Text('No users found'));
        }
      },
    );
  }
}

ধাপে ধাপে ব্যাখ্যা:

ধাপ ১: মডেল ক্লাস (User):

  • User ক্লাসে ডেটার স্ট্রাকচার নির্ধারণ করা হয়েছে। fromMap এবং toMap মেথড তৈরি করা হয়েছে JSON ডেটাকে Dart অবজেক্টে রূপান্তর করতে এবং বিপরীতভাবে Dart অবজেক্টকে JSON এ রূপান্তর করতে।

ধাপ ২: ডেটাবেজ হেল্পার ক্লাস (DatabaseHelper):

  • Singleton Pattern ব্যবহার করা হয়েছে যাতে একাধিক ইনস্ট্যান্স তৈরি না হয়।
  • _initDB মেথডে ডেটাবেজ তৈরি এবং সেটআপ করা হয়।
  • _createDB মেথডে ডেটাবেজের টেবিল গঠন করা হয়েছে।
  • CRUD অপারেশন:
    • insertUser: নতুন ইউজার ইনসার্ট করে।
    • getUsers: ডেটাবেজ থেকে সকল ইউজার রিটার্ন করে।
    • updateUser: একটি ইউজার আপডেট করে।
    • deleteUser: একটি ইউজার ডিলিট করে।

ধাপ ৩: UI তৈরি করা (UserListScreen):

  • FutureBuilder ব্যবহার করে ইউজার ডেটা লোড করা হয়েছে এবং UI তে প্রদর্শন করা হয়েছে।
  • লোডিং, ত্রুটি, এবং ডেটা প্রদর্শনের স্টেট হ্যান্ডেল করা হয়েছে।

SQLite Integration এর সুবিধা:

  • লোকাল ডেটা সংরক্ষণ: SQLite ডেটাবেজের মাধ্যমে অফলাইন মোডে ডেটা সংরক্ষণ এবং পুনরুদ্ধার করা যায়।
  • ডেটাবেজ অপারেশন সহজে পরিচালনা: sqflite প্যাকেজের মাধ্যমে ডেটাবেজের CRUD অপারেশন সহজে করা যায়।
  • ছোট এবং কার্যকরী: ছোট অ্যাপ্লিকেশনের জন্য SQLite খুব কার্যকর, কারণ এটি হালকা এবং দ্রুত।

সংক্ষেপে:

  • sqflite প্যাকেজ ব্যবহার করে SQLite ডেটাবেজ ইন্টিগ্রেশন করা হয়।
  • মডেল ক্লাস তৈরি করে ডেটার কাঠামো নির্ধারণ করা হয়।
  • ডেটাবেজ হেল্পার ক্লাস তৈরি করে CRUD অপারেশন পরিচালনা করা হয়।
  • FutureBuilder ব্যবহার করে UI তে ডেটা লোড এবং প্রদর্শন করা হয়।
Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...